#include <stdio.h>
#include <stdlib.h>
#include "parser-tools.h"
#include "graph.h"
#include "solution.h"
#include "graphbmp-tools.h"
#include "tabooState.h"
#include "parser.h"
#include "stm.h"
#include "configparser.h" // per configurazione da file
#include "ALGConfiguration.h" // per configurazione da file
#include "LTMConfiguration.h"
#include "ltm.h"

/**esegue il nostro algoritmo.
 *
 * @param argn il numero di parametri da inserire nell'algoritmo. Inserire, <b>secondo questo ordine </b>, i parametri:
 * 	@li un file in cui e' contenuto il grafo
 * 	@li il numero di camion da utilizzare
 * @param args i vari input da inserire nel nostor algoritmo. Inserire per il momento solo il file contenente il grafo
 * @return 0 se tutto va bene; 1 se c'e' qualche problema di non natura non meglio specificata.
 */
int main(int argn, const char** args){

	// ********************** VARIABILI DEL PROGRAMMA ************************
	int N;
	int K;
	Pgraph p_graph;
	Psolution p_solution;
	Psolution p_optimum;
	PtabooState p_tabooState;

	//***************** RECUPERO DEGLI INPUT DEL PROGRAMMA ***************
	FILE* f_config;
	FILE* f_graph;
	FILE* f_bitmap;

	if (argn==2){
		f_config = fopen(args[1], "r");
	}else{
		printf("numero di parametri passati errati.\n");
		return EXIT_FAILURE;
	}

	//***************** LETTURA DA FILE ***************
	PalgConfiguration pALGconfig = parseConfigurationFile(f_config);
	PLTMConfiguration pLTMconfig = initLTMConfiguration(pALGconfig);
	K = pALGconfig->vehicleNumber;
	f_bitmap = fopen(pALGconfig->constructiveDrawingPath, "w");
	f_graph = fopen(pALGconfig->graphPath, "r");

	//***************** COSTRUZIONE STRUTTURE DATI BASE ***************
	printf("parso il grafo...\n");
	p_graph = parseGraph(f_graph, &N);
	printf("controllo le disuguaglianze triangolari...\n");
	graphCorrector(p_graph);
	printf("riempio il grafo...\n");
	dijkstraFiller(p_graph);
	initSmartWeights(p_graph);
	printf("creo una soluzione...\n");
	p_solution = initSolution(&K, &N);
	printf("creo le strutture taboo...\n");
	p_tabooState = initTabooState(&N, &K, 0);
	printf("lancio LTM...\n");
	p_optimum = executeLTM(p_graph, pLTMconfig);

	/* ****************** MOSTRO MIGLIORE SOLUZIONE IN ITERAZIONE STM ************************/

	printf("\n\n\nLA SOLUZIONE MIGLIORE E':\n");
	int k;
	for (k=0; k<K; k++){
		printVehicleState(stdout, p_optimum->states[k], k);
		printRemainingResources(stdout, p_graph, p_optimum->states[k]->tau, p_optimum->states[k]->theta);
		printVehicleGathering(stdout, p_optimum->states[k]->pvp, p_solution->gMatrix, k);
	}
	printf("FINE.\n");
	return EXIT_SUCCESS;
}
// END OF MAIN :D
